# import sys,os
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo_pro.settings.dev')
# sys.path.insert(0, '/home/ubuntu/Desktop/meiduo_pro/meiduo_pro')
# import django
# django.setup()

def get_breadcrumb(category):
    # 定义一个字典
    dict = {
        'cat1': '',
        'cat2': '',
        'cat3': ''
    }
    # 判断 category 是哪一个级别的.
    # 注意: 这里的 category 是 GoodsCategory对象
    if category.parent is None:
        # 当前类别为一级类别
        dict['cat1'] = category.name
        # 因为当前这个表示自关联表, 所以关联的对象还是自己:
    elif category.parent.parent is None:
        # 当前类别为二级类别
        dict['cat2'] = category.name
        dict['cat1'] = category.parent.name
    else:
        dict['cat3'] = category.name
        dict['cat2'] = category.parent.name
        dict['cat1'] = category.parent.parent.name
    return dict


# 将我们之前写的获取商品分类的代码,提取出来一部分, 封装成一个独立的函数:

# 导入:
from django import http
from collections import OrderedDict
from goods.models import GoodsCategory
from goods.models import GoodsChannel, SKU
from goods.models import  SKUImage, SKUSpecification
from goods.models import  GoodsSpecification, SpecificationOption


def get_goods_and_spec(sku_id):

    # ======== 获取该商品和该商品对应的规格选项id ========
    # 根据 sku_id 获取该商品(sku)
    sku = SKU.objects.get(id=sku_id) # 64G的白色苹果8
    # 获取该商品的选项组合
    cur_sku_spec_options = SKUSpecification.objects.filter(sku=sku)
    # 中间表查询集,遍历出对象找到具体选项值(64g,金色,...)
    cur_sku_options = [temp.option_id for temp in cur_sku_spec_options]

    # ======== 获取类别下所有商品对应的规格选项id ========
    # 根据sku对象,获取对应的类别
    goods = sku.goods # 苹果手机
    # 获取该类别下面的所有商品
    skus = SKU.objects.filter(goods=goods) # 苹果8,苹果X
    dict = {}
    for temp_sku in skus:
        # 获取每一个商品(temp_sku)的规格参数
        sku_zuhe = SKUSpecification.objects.filter(sku=temp_sku).order_by('spec_id')
        # 中间表的一个查询集
        temp_list = []
        for zuhe in sku_zuhe:
            # 规格 ---> 规格选项 ---> 规格选项id ----> 保存到[]
            temp_list.append(zuhe.option.id) # (白色,金色,64G,256G)

        # 把 list 转为 () 拼接成 k : v 保存到dict中:
        dict[tuple(temp_list)] = temp_sku.id
    # {(白色,金色,64G,256G): 苹果8_id, ...}

    # ======== 在每个选项上绑定对应的sku_id值 ========
    guige_list = GoodsSpecification.objects.filter(goods=goods).order_by('id')
    # [颜色,内存] or [屏幕尺寸,颜色,版本]

    # enumerate()枚举函数,返回下标
    for index, guige in enumerate(guige_list): # 1,颜色 2,内存
        # 该规格的选项
        from copy import deepcopy
        temp_list = deepcopy(cur_sku_options )
        guige_xuanxiang = SpecificationOption.objects.filter(spec=guige)
        # [红色,白色] or [64g,256g] or ...

        for xuanxiang in guige_xuanxiang:
            # 在规格参数sku字典中查找符合当前规格的sku
            temp_list[index] = xuanxiang.id
            xuanxiang.sku_id = dict.get(tuple(temp_list))

        guige.spec_options = guige_xuanxiang

    return goods, guige_list, sku

def get_categories():

    # ======== 生成上面字典格式数据 ========
    # 第一部分: 从数据库中取数据:
    # 定义一个有序字典对象
    dict = OrderedDict()

    # 对 GoodsChannel 进行 group_id 和 sequence 排序, 获取排序后的结果:
    channels = GoodsChannel.objects.order_by('group_id', 'sequence')

    # 遍历排序后的结果: 得到所有的一级菜单( 即,频道 )
    for channel in channels:
        # 从频道中得到当前的 组id
        group_id = channel.group_id

        # 判断: 如果当前 组id 不在我们的有序字典中:
        if group_id not in dict:
            # 我们就把 组id 添加到 有序字典中
            # 并且作为 key值, value值是
            # {'channels': [], 'sub_cats': []}
            dict[group_id] =  {
                                 'channels': [],
                                 'sub_cats': []
                               }

        # 获取当前频道的分类名称
        cat1 = channel.category

        # 给刚刚创建的字典中, 追加具体信息:
        # 即, 给'channels' 后面的 [] 里面添加如下的信息:
        dict[group_id]['channels'].append({
            'id':   cat1.id,
            'name': cat1.name,
            'url':  channel.url
        })
        cat2s = GoodsCategory.objects.filter(parent=cat1)
        # 根据 cat1 的外键反向, 获取下一级(二级菜单)的所有分类数据, 并遍历:
        for cat2 in cat2s:
            # 创建一个新的列表:
            cat2.sub_cats = []
            # 获取所有的三级菜单
            cat3s = GoodsCategory.objects.filter(parent=cat2)
            # 遍历
            for cat3 in cat3s:
                # 把三级菜单保存到cat2对象的属性中.
                cat2.sub_cats.append(cat3)
            # 把cat2对象保存到对应的列表中
            dict[group_id]['sub_cats'].append(cat2)

    return dict